package juego;

import java.util.ArrayList;
import java.util.Iterator;

public abstract class Proyectil extends Automata {

	//atributos de clase
	protected static int miRapidez = 10;
	protected static int miTamanio = 1;

	//atributos de instancia
	protected boolean esLeal;

	//metodos

	//constructor. llama al constructor de Automata
	public Proyectil(Coordenada ubicacion) {
		super(ubicacion);
		esLeal = false;//esLeal es false por defecto.
	};


	//pre: recibe como parametros las listas de moviles y de botines.
	//post: actualiza las listas y retorna los puntos que deban computarse
	@Override
	public int vivir(ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
		//movimiento
		this.movimientoPropio();
		//impacto
		int puntaje = this.impactar(listaDeMoviles,listaDeBotines);
		return puntaje;
	};


	//metodo privado que se encarga de modificar la ubicacion.
	//redefinicion del metodo de Automata
	@Override
	protected void movimientoPropio() {
		int movimiento = miRapidez;

		//si es leal se mueve para arriba
		if (esLeal){
			movimiento = movimiento * -1;
		};
		this.ubicacion.moverEnY(movimiento);
	};

	public void hacerLeal(){
		this.esLeal = true;
	};

	//redefinicion del metodo de Movil
	@Override
	public boolean verLealtad(){
		return this.esLeal;
	};


	//redefinicion del metodo de Movil
	@Override
	public boolean esProyectil(){
		return true;
	};

	@Override
	public boolean esNaveEnemiga(){
		return false;
	};

	public int verTamanio(){
		return miTamanio;
	};

	public int velocidad(){
		return miRapidez;
	};


	@Override
	public int recibirImpacto(Impacto impacto, ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
		this.vivo = false;
		return 0;
	};

	//Retorna el puntaje acumulado por la destruccion de otros moviles.
	//Este metodo se encarga de llamar al metodo destruirse.
	@Override
	protected int impactar(ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
		int puntaje = 0;
		boolean destruido = false;
		Iterator<Movil> iterador = listaDeMoviles.iterator();
		boolean contacto;

		while (iterador.hasNext()){

			Movil movil = iterador.next();
			try {
				contacto = movil.huboContacto(this);
				boolean enemigo = (this.esLeal != movil.verLealtad());

				if (contacto & enemigo & !movil.esProyectil()){
					puntaje += movil.recibirImpacto(this.impactoProvocado(), listaDeMoviles, listaDeBotines);

					//si no esta vivo lo elimina de la lista
					if (!movil.estaVivo()){
						iterador.remove();
					};
					destruido = true;
				}
			}
			catch (Exception e){}
		}

		if (destruido){
			this.destruirse(listaDeMoviles);
		}
		return puntaje;
	};

    
}




